package com.beiding.jsonanalyzer.analyze.func.base;

import com.beiding.jsonanalyzer.analyze.func.FuncBase;
import com.beiding.jsonanalyzer.analyze.func.FuncFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * 函数工厂
 * 创建一个函数实例
 *
 * @author 丁常磊
 * @date 2022/5/31 11:21
 */
public abstract class FuncFactoryAdaptor<T extends FuncBase> implements FuncFactory<T> {

    /**
     * 内核函数构建流程
     */
    private List<ForFunc<T>> forFuncs = new ArrayList<>();

    /**
     * 添加内核函数的构造逻辑
     *
     * @param forFunc
     * @return
     */
    public FuncFactory<T> addForFunc(ForFunc<T> forFunc) {
        forFuncs.add(forFunc);
        return this;
    }

    /**
     * 创建函数对象
     *
     * @return
     */
    @Override
    public T createInstance() {
        //先创建一个实例
        T instance = newInstance();
        //应用构建流程,构建该函数
        for (ForFunc<T> forFunc : forFuncs) {
            forFunc.handle(instance);
        }

        return instance;
    }

    protected abstract T newInstance();

}
